<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    let arr = [1, 2, 3, [4, 5]]

    // 写法1——for循环+递归
    function convert(arr) {
      let res = []  // 接收
      // 遍历数组
      for (let i = 0; i < arr.length; i++) {
        // 如果当前项为数字
        if (typeof arr[i] == 'number') {
          res.push(
            { value: arr[i] }
          )
        } else if (Array.isArray(arr[i])) {  // 如果为数组
          res.push({
            children: convert(arr[i])
          })
        }
      }
      return { children: res }
    }
    console.log(convert(arr));


    // 写法2——map+递归
    function convert1(item) {
      // 当前项为数字时 返回对象
      if (typeof item == 'number') {
        return { value: item }
      } else if (Array.isArray(item)) { // 传入值是数组时,返回children对象，并递归
        return {
          children: item.map(_item => convert1(_item))
        }
      }
    }

    convert1(arr)
    console.log(convert1(arr));

    /* 总结：方法1比方法2递归次数少，方法2比方法1代码简洁 */
  </script>
</body>

</html>